/**
 * https://www.bilibili.com/video/BV1Mb411e7re?p=11
 * 1. 8位数码管:
 * 管名  连接引脚
 *  A       7
 *  B       6
 *  C       4
 *  D       2
 *  E       1
 *  F       9
 *  G       10
 *  .DP     5
 *          3&8 连接在一起的, 是 共阴极/共阳极
 *
 * 共阴极 显示6:
 *      3=8 = 0,    AFEDCG=1,   B&.DP=0
 *
 *
 * 2. 四位一体数码管
 * 管名  连接引脚
 *  A       11
 *  B       7
 *  C       4
 *  D       2
 *  E       1
 *  F       10
 *  G       5
 *  .DP     3
 *          12,9,8,6 (DG1~DG4)分别的 共阴极/共阳极
 * 
 * 共阴极 显示6:
 *      3=8 = 0,    AFEDCG=1,   B&.DP=0
 */
#include <REGX52.H>
#include "Link/Delay_Utils.h"
#include "Link/Nixie_Tube_Utils.h"
#include "Link/Timer0_Utils.h"

void scan_light();
static void Timer0_onTick();

void main_nixie_tub() {
    //1.静态数码管显示: 在第2位显示6
    Nixie_Tube_Light_Num(1, 2, 6, 0, 0);

    //2.动态数码管显示
    // while(1) {
    //     scan_light();
    // }

    //3.定时器扫描 动态显示数码管(2~3ms), 参考"13.AT24C02_IIC.c"
    Timer0_Init(1000, 0);
    Timer0_setOnTickListener_Exact(1, &Timer0_onTick);

    while (1);
}

/**
 * 2.动态数码管显示 https://www.bilibili.com/video/BV1Mb411e7re?p=12
 *   消影:
 *      ∵数码管扫描是: 位选 + 段选 + 位选 + 段选 + ...
 *      而                     ↖的数据会串到下一位去
 *      ∴段选后, 需要延时(否则显示会比较暗) & 清0
 * 
 * 数码管驱动方式:
 * 1.单片机直接扫描: 硬件设备简单, 但会耗费大量的单片机CPU时间
 *       视频开发板 自带芯片: 74LS138(138译码器, 3根数据线)  +  74HC245(双向数据缓冲器, 8进8出)
 *       老师介绍其它芯片  : 74HC595(移位寄存器, 2根电源+3根数据), 节省IO口, 但也需要扫描
 * 2.专用驱动芯片  : 内部自带显存、扫描电路, 单片机只需要告诉它显示什么即可:
 *       老师推荐芯片      : TM1640
 */
static void scan_light() {
    //static, 变量不会被重复初始化
    static unsigned char i;
        // Nixie_Tube_Light_Num(1, 1, 1, 0, 1); Delayms(1); //需要延时(否则显示会比较暗)
        // Nixie_Tube_Light_Num(1, 2, 2, 0, 1); Delayms(1);
        // Nixie_Tube_Light_Num(1, 3, 3, 0, 1); Delayms(1);
        // Nixie_Tube_Light_Num(1, 4, 4, 0, 1); Delayms(1);
        // Nixie_Tube_Light_Num(1, 5, 5, 0, 1); Delayms(1);
        // Nixie_Tube_Light_Num(1, 6, 6, 0, 1); Delayms(1);
        // Nixie_Tube_Light_Num(1, 7, 7, 0, 1); Delayms(1);
        // Nixie_Tube_Light_Num(1, 8, 8, 0, 1); Delayms(1);
        for (i = 1; i <= 6; i++) {
            Nixie_Tube_Light_Num(1, i, i, i % 2, 1);
            Delayms(1);
        }
}

static void Timer0_onTick() {
    static unsigned char i = 1, count = 0;
    count++;
    //每2~3ms, 扫描1个数码管
    if (count >= 3) {
        count = 0;
        Nixie_Tube_Light_Num(1, i, i, i % 2, 1);
        i++;
        if (i >= 7) i = 1;
    }
}